More fixes: One of my fixes to type_traits earlier today was incorrect, so that is reverted. Recently clang appears to have tightened up its definition of is_convertible and that has caused some failures in [unordered_][multi]map. I've switched to using is_constructible to restablish the desired functionality in [unordered_][multi]map. Specifically, inserting rvalues of move-only types for the keys. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@133402 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/map b/include/map index d675bc5..cf9cbcf 100644 --- a/include/map +++ b/include/map
@@ -869,7 +869,7 @@ emplace() {return __tree_.__emplace_unique();} template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> _LIBCPP_INLINE_VISIBILITY pair<iterator, bool> emplace(_A0&& __a0) @@ -878,7 +878,7 @@ #ifndef _LIBCPP_HAS_NO_VARIADICS template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> pair<iterator, bool> emplace(_A0&& __a0, _Args&& ...__args); @@ -890,7 +890,7 @@ {return __tree_.__emplace_hint_unique(__p.__i_);} template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> _LIBCPP_INLINE_VISIBILITY iterator emplace_hint(const_iterator __p, _A0&& __a0) @@ -899,20 +899,20 @@ #ifndef _LIBCPP_HAS_NO_VARIADICS template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> iterator emplace_hint(const_iterator __p, _A0&& __a0, _Args&& ...__args); #endif // _LIBCPP_HAS_NO_VARIADICS template <class _P, - class = typename enable_if<is_convertible<_P, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _P>::value>::type> _LIBCPP_INLINE_VISIBILITY pair<iterator, bool> insert(_P&& __p) {return __tree_.__insert_unique(_STD::forward<_P>(__p));} template <class _P, - class = typename enable_if<is_convertible<_P, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _P>::value>::type> _LIBCPP_INLINE_VISIBILITY iterator insert(const_iterator __pos, _P&& __p) {return __tree_.__insert_unique(__pos.__i_, _STD::forward<_P>(__p));} @@ -995,11 +995,11 @@ #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES __node_holder __construct_node(); template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> __node_holder __construct_node(_A0&& __a0); #ifndef _LIBCPP_HAS_NO_VARIADICS template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> __node_holder __construct_node(_A0&& __a0, _Args&& ...__args); #endif // _LIBCPP_HAS_NO_VARIADICS #else // _LIBCPP_HAS_NO_RVALUE_REFERENCES @@ -1309,7 +1309,7 @@ template <class _Key, class _Tp, class _Compare, class _Allocator> template <class _A0, class ..._Args, - class //= typename enable_if<is_convertible<_A0, _Key>::value>::type + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type > pair<typename map<_Key, _Tp, _Compare, _Allocator>::iterator, bool> map<_Key, _Tp, _Compare, _Allocator>::emplace(_A0&& __a0, _Args&& ...__args) @@ -1324,7 +1324,7 @@ template <class _Key, class _Tp, class _Compare, class _Allocator> template <class _A0, class ..._Args, - class //= typename enable_if<is_convertible<_A0, _Key>::value>::type + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type > typename map<_Key, _Tp, _Compare, _Allocator>::iterator map<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p, @@ -1601,7 +1601,7 @@ iterator emplace() {return __tree_.__emplace_multi();} template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> _LIBCPP_INLINE_VISIBILITY iterator emplace(_A0&& __a0) @@ -1610,7 +1610,7 @@ #ifndef _LIBCPP_HAS_NO_VARIADICS template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> iterator emplace(_A0&& __a0, _Args&& ...__args); @@ -1621,7 +1621,7 @@ {return __tree_.__emplace_hint_multi(__p.__i_);} template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> _LIBCPP_INLINE_VISIBILITY iterator emplace_hint(const_iterator __p, _A0&& __a0) @@ -1630,20 +1630,20 @@ #ifndef _LIBCPP_HAS_NO_VARIADICS template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> iterator emplace_hint(const_iterator __p, _A0&& __a0, _Args&& ...__args); #endif // _LIBCPP_HAS_NO_VARIADICS template <class _P, - class = typename enable_if<is_convertible<_P, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _P>::value>::type> _LIBCPP_INLINE_VISIBILITY iterator insert(_P&& __p) {return __tree_.__insert_multi(_STD::forward<_P>(__p));} template <class _P, - class = typename enable_if<is_convertible<_P, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _P>::value>::type> _LIBCPP_INLINE_VISIBILITY iterator insert(const_iterator __pos, _P&& __p) {return __tree_.__insert_multi(__pos.__i_, _STD::forward<_P>(__p));} @@ -1721,11 +1721,11 @@ #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES __node_holder __construct_node(); template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> __node_holder __construct_node(_A0&& __a0); #ifndef _LIBCPP_HAS_NO_VARIADICS template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> __node_holder __construct_node(_A0&& __a0, _Args&& ...__args); #endif // _LIBCPP_HAS_NO_VARIADICS #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES @@ -1761,7 +1761,7 @@ template <class _Key, class _Tp, class _Compare, class _Allocator> template <class _A0, - class // = typename enable_if<is_convertible<_A0, value_type>::value>::type + class // = typename enable_if<is_constructible<value_type, _A0>::value>::type > typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0) @@ -1778,7 +1778,7 @@ template <class _Key, class _Tp, class _Compare, class _Allocator> template <class _A0, class ..._Args, - class // = typename enable_if<is_convertible<_A0, key_type>::value>::type + class // = typename enable_if<is_constructible<key_type, _A0>::value>::type > typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _Args&& ...__args) @@ -1799,7 +1799,7 @@ template <class _Key, class _Tp, class _Compare, class _Allocator> template <class _A0, class ..._Args, - class //= typename enable_if<is_convertible<_A0, _Key>::value>::type + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type > typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator multimap<_Key, _Tp, _Compare, _Allocator>::emplace(_A0&& __a0, _Args&& ...__args) @@ -1813,7 +1813,7 @@ template <class _Key, class _Tp, class _Compare, class _Allocator> template <class _A0, class ..._Args, - class //= typename enable_if<is_convertible<_A0, _Key>::value>::type + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type > typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator multimap<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p,